import { isObject } from './../common/utils';
import { mutableHandlers } from './baseHandlers';

// 源码里实际有reactive、shallowReactive、readonly、shallowReadonly 此处只写reactive方法的实现
export function reactive(target) {
  return createReactiveObject(target, false, mutableHandlers);
}
// reactive核心：使用柯理化思想，最核心的是通过new Proxy()进行拦截，读取和修改数据

let reactiveMap = new WeakMap() // 使用WeakMap创建空对象，会自动垃圾回收，不会造成内存泄漏，并且key值只能是对西那个
export function createReactiveObject(target, isReadonly, baseHandler) {
  if (isObject(target)) {
    // 如果target不是对象，reactive无法实现拦截,reactive这个api只能拦截对象
    return target;
  }
  let proxyMap = reactiveMap; //用于存放被代理过的对象
  let existProxy = proxyMap.get(target); // 获取被代理过的对象
  if (existProxy) {
    // 如果已经代理过 直接返回
    return existProxy;
  }
  // 如果没有代理，new Proxy 创建代理
  let proxy = new Proxy(target, baseHandler);
  proxyMap.set(target, proxy); //同时需要把代理过的 同步到proxyMap对象中

  return proxy;

}